 /*******************************************************************************
  * Copyright (c) 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.core.internal.runtime.auth;

 import java.util.ArrayList ;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.osgi.framework.log.FrameworkLog;
 import org.eclipse.osgi.framework.log.FrameworkLogEntry;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 import org.osgi.util.tracker.ServiceTracker;

 public class Activator implements BundleActivator {

     private static BundleContext bundleContext;
     private static ServiceTracker logTracker;

     /*
      * Return this activator's bundle context.
      */
     public static BundleContext getContext() {
         return bundleContext;
     }

     /* (non-Javadoc)
      * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
      */
     public void start(BundleContext context) throws Exception {
         Activator.bundleContext = context;
     }

     /* (non-Javadoc)
      * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
      */
     public void stop(BundleContext context) throws Exception {
         if (logTracker != null) {
             logTracker.close();
             logTracker = null;
         }
         Activator.bundleContext = null;
     }

     /*
      * Log the given status in the framework log.
      */
     public static void log(IStatus status) {
         if (logTracker == null) {
             logTracker = new ServiceTracker(getContext(), FrameworkLog.class.getName(), null);
             logTracker.open();
         }
         FrameworkLog log = (FrameworkLog) logTracker.getService();
         log.log(getEntry(status));
     }

     /*
      * Copied code from PlatformLogWriter to convert a status object into
      * a FrameworkLogEntry.
      */
     private static FrameworkLogEntry getEntry(IStatus status) {
         Throwable t = status.getException();
         ArrayList childlist = new ArrayList ();

         int stackCode = t instanceof CoreException ? 1 : 0;
         // ensure a sub-status inside a CoreException is properly logged
 if (stackCode == 1) {
             IStatus coreStatus = ((CoreException) t).getStatus();
             if (coreStatus != null)
                 childlist.add(getEntry(coreStatus));
         }

         if (status.isMultiStatus()) {
             IStatus[] children = status.getChildren();
             for (int i = 0; i < children.length; i++)
                 childlist.add(getEntry(children[i]));
         }

         FrameworkLogEntry[] children = (FrameworkLogEntry[]) (childlist.size() == 0 ? null : childlist.toArray(new FrameworkLogEntry[childlist.size()]));

         return new FrameworkLogEntry(status.getPlugin(), status.getSeverity(), status.getCode(), status.getMessage(), stackCode, t, children);
     }

 }

